import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Mundo en el cual interactuan todaslas subclases
 * 
 * @author (ALHE) 
 * @version (1.1)
 */

 
public class WonderWorld extends World
{

       private Counter vidas;//checa las vidas
       private Counter puntos;//checa los puntos
       private Counter inmunidad;
       private Counter numNivel;
       private Counter balas;
       private Duende duende;
       private SimpleTimer tiempo;
       private int mov; // indica si el personaje se mueve o no
       private boolean mvDer;// indica si el personaje se puede mover a la derecha
       private boolean mvIzq;//indica si el personaje se puede mover a la izquierda
       private int nivel;
       private Counter olla;
       
       private GreenfootSound musica;
       
      
    
    /**
     * Se inicializan y agregan al mundo los objetos que interactuaran con el personaje princial
     * 
     */
    public WonderWorld()
    {    
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels.
        super(600, 400, 1,false); 
        mov=0;
        setPaintOrder(Duende.class,Enemigo.class,Bonus.class,Agua.class,Piso.class);
        setActOrder(Duende.class,Bonus.class,Enemigo.class,Agua.class,Piso.class);
         tiempo=new SimpleTimer();
         
        tiempo.mark();
        
        
        vidas=new Counter("Vidas: ");
        puntos=new Counter("Puntos: ");
        inmunidad=new Counter("immunity:");
        numNivel=new Counter("nivel: ");
        olla=new Counter("Olla: ");
        balas=new Counter("balas: ");
        
        duende=new Duende(this);
        //prueba=new GifImage("hada1"); 
        
        vidas.setValue(6);
        
        
        mvDer=true;
        mvIzq=true;
        nivel=1;
        
        
       
        musica= new  GreenfootSound("juego.mp3");
        
       
        prepare();
    }
    
    /** 
     * seter de la variable mov indica si el personaje se mueve o no
     **/
    public void setMov(int d)
    {
        mov+=d;
    }
    /**
     * @return regresa el valor de la variable del movimiento 
     **/
    public int getMov()
    {
        return mov;
    }
    
    /** 
     *@return geter de la variable indica si el personaje se puede mover a la derecha
     **/
    public boolean getmvDer()
    {
        return mvDer;
    }
    /** 
     * seter de la variable indica si el personaje se puede mover a la derecha
       **/
    public void setmvDer(boolean valor)
    {
        mvDer=valor;
    }
    /**  
     *  @return  la direccion del personaje ,geter de la variable indica si el personaje se puede mover a la izquierda
       **/
    public boolean getmvIzq()
    {
        return mvIzq;
    }
    /** 
     * seter de la variable indica si el personaje se puede mover a la izquierda
     **/
    public void setmvIzq(boolean valor)
    {
        mvIzq=valor;
    }
   
    
   /**
     * Prepare the world for the start of the program. That is: create the initial
     * objects and add them to the world.
     */
    private void prepare()
    {
     
      
      menu();
      
    }
     /**
     * agrega a los objetos que interactuan en el primer nivel
     */
    public void nivel1()
    {
        /*
         * siempre aparece
         */
       addObject(vidas,538,15); 
      addObject(puntos,52,15);
      addObject(inmunidad,538,48);
      addObject(numNivel,52,49);
      addObject(olla,299,16);
      addObject(balas,299,48);
      
       numNivel.setValue(1);
         mov=0;
        this.removeObjects((getObjects(Boton.class)));
        this.removeObjects((getObjects(Enemigo.class)));
        this.removeObjects((getObjects(Piso.class)));
        this.removeObjects((getObjects(Bonus.class)));
        this.removeObjects((getObjects(Agua.class)));
        
        GreenfootImage imagen;
        imagen=new GreenfootImage("uno.jpg"); // ajusta la imagen al tamano de la pantalla
        //imagen.scale(getWidth(),getHeight());
        setBackground(imagen) ;
         
        addObject(duende, 62, 310);
        Piso piso = new Piso(1);
        addObject(piso, getWidth()/2,getHeight()-5);
        addObject(new Piso(1), 3*getWidth()/2,getHeight()-5);
        addObject(new Piso(1), 5*getWidth()/2,getHeight()-5);
        addObject(new Piso(1), 7*getWidth()/2+205,getHeight()-5);
        addObject(new Piso(1), 9*getWidth()/2+205,getHeight()-5);
        //addObject(new Piso(), 11*getWidth()/2+205,getHeight()-5);
        addObject(new Agua(), 5500,getHeight()-5);
        addObject(new Bala(),272,224);
        addObject(new Arana(),161,231);
        addObject(new Moneda(),241,256);
        addObject(new Moneda(),274,256);
        addObject(new Moneda(),306,256);
        addObject(new Plataforma(),366,346);
        addObject(new Plataforma(),392,305);
        addObject(new Plataforma(),431,265);
        addObject(new Hada(),545,135);
        addObject(new Rana(),700,351);
        addObject(new Olla(),490,354);
        addObject(new Arana(),910,231);
        addObject(new Olla(),910,200);
        addObject(new Moneda(),910,357);
        addObject(new Caracol(),1200,351); 
        addObject(new Plataforma(),1431,302);
        addObject(new Moneda(),1420,240);
        addObject(new Moneda(),1440,240);
        addObject(new Agua(),1850,380);
        addObject(new Plataforma(),1960,380);
        addObject(new Plataforma(),2066,300);
        addObject(new Plataforma(),2312,238);
        addObject(new Olla(),2350,200);
        addObject(new Trebol(),2370,292);
        addObject(new Moneda(),2186,250);
        addObject(new Moneda(),2186,300);
        addObject(new Moneda(),2186,351);
        addObject(new Caracol(),2200,351);
        addObject(new Rana(),2417,351);
         addObject(new Pared(),2620,305);
        addObject(new GanaNivel(),2600,305);
        
       
        
        
       
    }
    /**
     * agrega a los objetos que interactuan en el segundo nivel
     */
    public void nivel2()
    {
        numNivel.setValue(2);
         mov=0;
        GreenfootImage imagen;
        imagen=new GreenfootImage("nivel2.png"); // ajusta la imagen al tamano de la pantalla
        imagen.scale(getWidth(),getHeight());
        setBackground(imagen) ;
        this.removeObjects((getObjects(Enemigo.class)));
        this.removeObjects((getObjects(Piso.class)));
        this.removeObjects((getObjects(Bonus.class)));
        this.removeObjects((getObjects(Agua.class)));
        Piso piso = new Piso(2);
        addObject(piso, getWidth()/2,getHeight()-5);
        addObject(new Piso(2), 3*getWidth()/2,getHeight()-5);
        addObject(new Piso(2), 5*getWidth()/2,getHeight()-5);
        addObject(new Piso(2), 7*getWidth()/2+205,getHeight()-5);
        addObject(new Piso(2), 9*getWidth()/2+205,getHeight()-5);
        //addObject(new Piso(2), 11*getWidth()/2+205,getHeight()-5);
        addObject(new Moneda(),203,249);
        addObject(new Moneda(),203,300);
        addObject(new Moneda(),203,356);
        addObject(new Plataforma(),294,310);
        addObject(new PuercoEspin(),375,345);
        addObject(new Hada(),280,150);
        //addObject(new Moneda(),742,356);
        addObject(new Bala(),560,323);
        addObject(new Arana(),640,231);
        addObject(new Moneda(),690,305);
        addObject(new Moneda(),710,279);
        addObject(new Moneda(),740,305);
        addObject(new Olla(),710,349);
        addObject(new Rana(),906,352);
        addObject(new Bala(),1040,323);
        addObject(new Plataforma(),1000,352);
        addObject(new Plataforma(),1040,314);
        addObject(new Moneda(),1020,128);
        addObject(new Moneda(),1160,128);
        addObject(new Olla(),1070,122);
        addObject(new Trebol(),1157,337);
        addObject(new PuercoEspin(),1270,345);
        addObject(new Moneda(),1488,195);
        addObject(new Moneda(),1537,195);
        addObject(new Bala(),1511,162);
        addObject(new Plataforma(),1466,346);
        addObject(new Plataforma(),1513,305);
        addObject(new Rana(),1693,348);
        addObject(new Moneda(),2305,248);
        addObject(new Plataforma(),2164,318);
        addObject(new Plataforma(),2341,201);
        addObject(new Olla(),2335,341);
        addObject(new Rana(),2432,349);
        addObject(new Trebol(),2343,95);
        addObject(new Moneda(),2305,95);
        addObject(new Moneda(),2377,95);
        addObject(new PuercoEspin(),2622,345);
        addObject(new Moneda(),2822,305);
        addObject(new Moneda(),2842,279);
        addObject(new Moneda(),2862,305);
        addObject(new Trebol(),2842,200);
        addObject(new Caracol(),2900,351);
        addObject(new Pared(),3295,305);
        addObject(new GanaNivel(),3285,305);
        
        
        
        //addObject(new Piso(), 11*getWidth()/2+205,getHeight()-5);
    }
    /**
     * agrega los objetos que representan al tercer nivel
     */
     public void nivel3()
    {
        numNivel.setValue(3);
         mov=0;
        GreenfootImage imagen;
        imagen=new GreenfootImage("inicio.jpg"); // ajusta la imagen al tamano de la pantalla
        imagen.scale(getWidth(),getHeight());
        setBackground(imagen) ;
        this.removeObjects((getObjects(Enemigo.class)));
        this.removeObjects((getObjects(Piso.class)));
        this.removeObjects((getObjects(Bonus.class)));
        this.removeObjects((getObjects(Agua.class)));
        Piso piso = new Piso(3);
        addObject(piso, getWidth()/2,getHeight()-5);
        addObject(new Piso(3), 3*getWidth()/2,getHeight()-5);
        addObject(new Piso(3), 5*getWidth()/2,getHeight()-5);
        addObject(new Piso(3), 7*getWidth()/2+205,getHeight()-5);
        addObject(new Piso(3), 9*getWidth()/2+410,getHeight()-5);
        addObject(new Piso(3), 11*getWidth()/2+205,getHeight()-5);
        addObject(new Piso(3), 13*getWidth()/2,getHeight()-5);
        addObject(new Moneda(),203,249);
        addObject(new Moneda(),203,300);
        addObject(new Moneda(),203,356);
        addObject(new Plataforma(),294,310);
        addObject(new PuercoEspin(),379,345);
        addObject(new Trebol(),294,276);
        addObject(new Moneda(),1064,287);
        addObject(new Bala(),560,323);
        addObject(new Arana(),640,231);
        addObject(new Hada(),1032,203);
        addObject(new Moneda(),1032,287);
        addObject(new Moneda(),996,287);
        addObject(new Olla(),710,349);
        addObject(new Rana(),1060,352);
        addObject(new Plataforma(),1000,352);
        addObject(new Plataforma(),1040,314);
        addObject(new Moneda(),1020,128);
        addObject(new Moneda(),1120,128);
        addObject(new Olla(),1070,122);
        addObject(new Trebol(),294,276);
        addObject(new Trebol(),1157,337);//
        addObject(new Arana(),1300,231);
        addObject(new Arana(),1650,231);
        addObject(new Rana(),1500,352);
        addObject(new Agua(), 1866,381);
        addObject(new Agua(), 1940,381);
        addObject(new PuercoEspin(), 2310,351);
        addObject(new Moneda(),2122,256);
        addObject(new Moneda(),2154,256);
        addObject(new Plataforma(),2214,346);
        addObject(new Plataforma(),2240,305);
        addObject(new Plataforma(),2275,265);
        addObject(new Rana(),2500,351);
        addObject(new Trebol(),2600,276);
        addObject(new Arana(),3000,231);
        addObject(new Moneda(),3000,249);
        addObject(new Moneda(),3030,300);
        addObject(new Moneda(),3060,356);
        addObject(new Rana(),3430,351);
        addObject(new Plataforma(),3430,300);
        addObject(new Bala(),3430,200);
        addObject(new Caracol(),3650,351);
        addObject(new Moneda(),3646,140);
        addObject(new Moneda(),3646,271);
        addObject(new Olla(),3646,210);
        addObject(new PuercoEspin(),3970,351);
        addObject(new Pared(),4400,305);
        addObject(new GanaJuego(),4100,351);
        
    }
    
    /**
     * metodo que valida  cuando el personaje pierde el juego;
     * espera 5 segundos para mostrar las puntusciones mejores del juego y regresa al menu
     */
    public void PierdeJuego()
    {
        ScoreBoard score;
        vidas.setValue(6);
        olla.setValue(0);
        puntos.setValue(0);
        balas.setValue(0);
        GreenfootImage imagen;
        imagen=new GreenfootImage("findelJuego.jpg"); // ajusta la imagen al tamano de la pantalla
        imagen.scale(getWidth(),getHeight());
        setBackground(imagen) ;
        this.removeObjects((getObjects(Enemigo.class)));
        this.removeObjects((getObjects(Piso.class)));
        this.removeObjects((getObjects(Bonus.class)));  
        this.removeObjects((getObjects(Duende.class))); 
        Greenfoot.delay(200);
        addObject(score=new ScoreBoard(600, 400), getWidth() /2, getHeight() /2);
        score.guardaRecord(puntos.getValue());
        Greenfoot.delay(200);
        menu();
        
    }
    /**
     * metodo que verifica si el jugador gano la partida
     * este metodo espera unos cuantos segundos para mostrar los records y para regresar al menu
     */
    public void ganar()
    {
        ScoreBoard score;
        removeObjects((getObjects(null)));
        GreenfootImage imagen;
         imagen=new GreenfootImage("ganaste.png"); // ajusta la imagen al tamano de la pantalla
        imagen.scale(getWidth(),getHeight());
        setBackground(imagen) ;
        
        Greenfoot.delay(200);
        addObject(score=new ScoreBoard(600, 400), getWidth() /2, getHeight() /2);
        score.guardaRecord(puntos.getValue());
        Greenfoot.delay(200);
        menu();
         
         
         
        
    }
    /**
     * es invocado por el personaje principal dependiendo del valor del nivel
     */
    public void reiniciaNivel()
    {
        
        olla.setValue(0); 
      if(nivel==1)
       
          
           nivel1();
        
      else if(nivel==2)
        nivel2();
        
      else if(nivel==3)
         nivel3();
         
    }
     /**
      * @return al objeto contador par poder utilizarlo ,geter del contador de los puntos 
        */
    public Counter getPuntos()
    {
        return puntos;
    }
    /**
     * @return al contador  para poder utilizarlo geter del contador de las vidas
       */
    public Counter getVidas()
    {
        return vidas;
    }
    /**
     * @return el contador de las ollas para poder utilizarlo contador de hollas
     */
     public Counter getOlla()
    {
        return olla;
    }
    /**
     * @return el contador de las inmunidad para poder utilizarlo geter del contador de tiempo de inmunidad
     */
     public Counter getInmunidad()
    {
        return inmunidad;
    }
    /**
     * @return el contador de las balas para poder utilizarlo contador de Balas
     */
     public Counter getBala()
    {
        return balas;
    }
    /**
     * metodo que verifica en que nivel se encuentra el personaje
     */
    public void cambiaNive()
     {
         if(nivel==2)
        {
          nivel3();
          nivel=3;
        }
        
       if(nivel==1)
       {
          nivel2();
          nivel=2;
        }
          
    }
    /**
     * sobreescritura del metodo para detener sin reiniciar el juego
     */
   
    public void stopped()
    {
        super.stopped();
        musica.pause();
    }
    
    public void started()
    {
        super.started();
        musica.play();
    }
    
    /**
     * meyodo que agrega los botones del menu
     */
    public void menu()
    {
         removeObjects((getObjects(null)));
         this.setBackground("menu.png");
         this.addObject(new Jugar(),518, 65);
         this.addObject(new Ayuda(),518, 152);
         this.addObject(new Store(),518, 258);
          this.addObject(new Creditos(),518, 351);

    }
    /**
     * metodo que se invoca cuando se oprime el boton de ayuda
     */
    public void ayuda()
    {
    
          GreenfootImage imagen;
         
        imagen=new GreenfootImage("ayudaes.png"); // ajusta la imagen al tamano de la pantalla
        imagen.scale(imagen.getWidth()/2 ,imagen.getHeight()/2);
        //setImage(imagen);
    
         removeObjects((getObjects(null)));
         this.setBackground(imagen);
          this.addObject(new Regresa(),541, 344);
         
       
        
    }
    /**
     * metodo para mostrar los creditos
     */
     public void creditos()
    {
    
          GreenfootImage imagen;
         
        imagen=new GreenfootImage("creditosfinal.png"); // ajusta la imagen al tamano de la pantalla
        
    
         removeObjects((getObjects(null)));
         this.setBackground(imagen);
          this.addObject(new Regresa(),47, 367);
         
       
        
    }
    
    
    
    
        
     
}
